//
//  "$Id: TTSSpeech.h  2016-01-25 $"
//
//	Description:	人脸底库管理接口
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __FACELIB_API_H__
#define __FACELIB_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

///特征基本信息结构体，64字节
typedef struct
{
	char		*pLibName;		///< 库名
	char		*pRecordName;	///< 记录名	
	char		*pFeatureName;	///< 特征名
	int			featureScore;	///< 分数
	int			reserved[12];	///< 保留
}FaceLibFeatureBase;

///特征基本信息，128字节
typedef struct
{
	char		*pLibName;		///< 库名
	int			libNameLen;		///< 库名长度
	char		*pRecordName;	///< 记录名	
	int			recordNameLen;	///< 记录名长度
	char		*pFeatureName;	///< 特征名
	int			featureNameLen;	///< 特征名长度
	int			featureScore;	///< 分数
	int			reserved[25];	///< 保留
}FaceLibFeatureInfo;

///获取特征值的媒体数据，128字节
typedef struct
{
	int 		reserve;			///< 保留
	void		*pPicuture;		 	///< 图片数据
	int			picutureLen;		///< 图片长度
	int			reserved[29];	 	///< 保留
}FaceLibMedia;

///特征导入信息结构体，128字节
typedef struct
{
	FaceLibFeatureBase feature;		///< 特征信息
	char		*pPicuture;		 	///< 图片数据
	int			picutureLen;		///< 图片长度
	void *		pFeatureVal;		///< 特征值内存地址
	int			featureValLen;		///< 特征值长度
	int			reserved[12];	 	///< 保留
}FaceLibFeatureIn;

///特征导出信息结构体，128字节
typedef struct
{
	char 		name[64];			///< 特征名
	int			reserved[16];		///< 保留
}FaceLibFeatureOut;

///记录基本信息结构体，64字节
typedef struct
{
	char		*pLibName;			///< 库名
	char		*pRecordName;		///< 记录名	
	int			reserved[14];		///< 保留
}FaceLibRecordBase;

///记录导入信息结构体，128字节
typedef struct
{
	FaceLibRecordBase record;		///< 记录
	int			reserved[16];		///< 保留
}FaceLibRecordIn;

///记录导出信息结构体，128字节
typedef struct
{
	char		name[64];			///< 记录名
	int		 featureNum;		  	///< 特征数
	int			reserved[15];		 ///< 保留
}FaceLibRecordOut;

///底库基本信息结构体，64字节
typedef struct
{
	char		*pLibName;			///< 库名	
	int			reserved[15];	 	///< 保留
}FaceLibBase;

///底库属性，128字节
typedef struct
{
	int			enable;			  	///< 使能	  
	int			threshold;			///< 报警相似度阈值 0~100
	int			reserved[30];	 	///< 保留
}FaceLibAttr;

///底库输入信息结构体，128字节
typedef struct
{
	FaceLibBase lib;				 ///< 底库信息
	int			reserved[16];		 ///< 保留
}FaceLibIn;

///底库输出信息结构体，128字节
typedef struct
{
	char		name[64];			///< 库名
	int			reserved[16];	 	///< 保留
}FaceLibOut;

///底库使能参数，128字节
typedef struct
{
	int		 enable;			  	///< 使能开关
	int			reserved[31];	 	///< 保留字节	
}FaceLibEnable;

///底库能力，128字节
typedef struct
{
	int		 mutex;				///< 是否需要和比对算法做互斥
	int			reserved[31]; 	///< 保留字节	
}FaceLibCaps;


/// 底库接口，512字节
typedef struct FaceLib
{
	/// 底层似有数据
	void *priv;
	
	/// 增加接口引用
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \retval 0 成功
	/// \retval <0失败
	int (*addRef)(struct FaceLib *thiz);
	
	/// 释放接口
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \retval 0 成功
	/// \retval <0失败
	int (*release)(struct FaceLib *thiz);

	/// 能力获取
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [out] caps 使能数据
	/// \retval 0 成功
	/// \retval <0失败
	int (*getCaps)(struct FaceLib *thiz, FaceLibCaps *caps);	

	/// 比对库使能
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] enablePrms 使能数据
	/// \retval 0 成功
	/// \retval <0失败
	int (*enable)(struct FaceLib *thiz, const FaceLibEnable *enablePrms);	

	/// 新建库,默认不使能
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] libIn 库导入信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*addLib)(struct FaceLib *thiz, const FaceLibIn *libIn);

	/// 删除库
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] libBase 库基本信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*delLib)(struct FaceLib *thiz, const FaceLibBase *libBase);

	/// 列举库信息
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [out] libOut 库导出信息
	/// \param [out] num 个数
	/// \retval 0 成功
	/// \retval <0失败
	int (*listLib)(struct FaceLib *thiz, FaceLibOut *libOut, int *num);

	/// 增加一条人脸特征
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pFeatureIn 特征导入信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*addFeature)(struct FaceLib *thiz, const FaceLibFeatureIn *featureIn);

	/// 删除一条人脸特征
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pFeatureBase 特征基本信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*delFeature)(struct FaceLib *thiz, const FaceLibFeatureBase *featureBase);

	/// 更新一条人脸特征
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pFeatureIn 特征传入信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*updateFeature)(struct FaceLib *thiz, const FaceLibFeatureIn *featureIn);
	
	/// 列举记录中的特征信息
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] recordBase 记录信息
	/// \param [out] featureOut 特征导出信息
	/// \param [out] num 个数
	/// \retval 0 成功
	/// \retval <0 记录不存在
	int (*listFeature)(struct FaceLib *thiz, const FaceLibRecordBase *recordBase, FaceLibFeatureOut *featureOut, int *num);

	/// 增加一条记录
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] recordIn 记录导入信息
	/// \retval 0 成功
	/// \retval <0失败
	int (*addRecord)(struct FaceLib *thiz, const FaceLibRecordIn *recordIn);

	/// 删除一条记录
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] libName 库名
	/// \param [in] recordName 记录名
	/// \retval 0 成功
	/// \retval <0失败
	int (*delRecord)(struct FaceLib *thiz, const FaceLibRecordBase *recordBase);

	/// 列举库中记录信息
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] lib 库信息
	/// \param [out] recordOut 记录导出信息
	/// \param [out] num 个数
	/// \retval 0 成功
	/// \retval <0失败
	int (*listRecord)(struct FaceLib *thiz, const FaceLibBase *lib, FaceLibRecordOut *recordOut, int *num);

	/// 设置底库属性
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] lib 库信息
	/// \param [in] attr 库属性
	/// \retval 0 成功
	/// \retval <0失败
	int (*setLibAttr)(struct FaceLib *thiz, const FaceLibBase *lib, const FaceLibAttr *attr);

	/// 获取底库属性
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] lib 库信息
	/// \param [out] attr 库属性
	/// \retval 0 成功
	/// \retval <0失败
	int (*getLibAttr)(struct FaceLib *thiz, const FaceLibBase *lib, FaceLibAttr *attr);

	/// 获取底库导入导出文件路径
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] name 库名
	/// \param [in] type 0:导入，1:导出
	/// \param [out] path 路径
	/// \param [in,out] len 路径长度
	/// \retval 0 成功
	/// \retval <0失败
	int (*getLoadPath)(struct FaceLib *thiz, const char *name, int type, char *path, int *len);

	/// 获取特征值
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pMedia 获取特征值的媒体数据
	/// \param [in,out] pFeatureOut 特征值,内存应用分配。
	/// \param [in,out] len 特征值长度。
	/// \retval 0 成功
	/// \retval <0失败
	int (*getFeature)(struct FaceLib *pThiz, FaceLibMedia *pMedia,void *pFeatureOut,int *len);

	/// 获取比对结果
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pFeatureIn 特征值,内存应用分配。
	/// \param [in] len 特征值长度。
	/// \param [in,out]  pFeatureInfoOut  比对成功后的特征信息，内存应用分配
	/// \retval 0 成功
	/// \retval <0失败
	int (*getCompare)(struct FaceLib *pThiz,void *pFeatureIn,int *len,FaceLibFeatureInfo *pFeatureInfoOut);


	/// 指定库名，获取比对结果
	///
	/// \param [in] thiz 人脸比对库接口指针
	/// \param [in] pFeatureIn 特征值,内存应用分配。
	/// \param [in] len 特征值长度。
	/// \param [in] pLibNameIn 指定要比对的库名
	/// \param [in,out]  pFeatureInfoOut  比对成功后的特征信息，内存应用分配
	/// \retval 0 成功
	/// \retval <0失败
	int (*getCompareFromLib)(struct FaceLib *pThiz,void *pFeatureIn,int *len,const char*pLibNameIn,FaceLibFeatureInfo *pFeatureInfoOut);

	/// 保留字节
	int reserved[107];
}FaceLib;

/// 接口描述，128字节
typedef struct FaceLibDesc
{
	int				reserved[32];	///< 保留字节
}FaceLibDesc;

/// 创建人脸比对库管理接口
///
/// \param [in] pDesc，人脸库管理接口描述指针
/// \param [out] ppFaceLib，人脸库管理接口指针的指针
/// \retval 0 成功
/// \retval <0 失败
int PAL_API createFaeLib(FaceLibDesc *pDesc, FaceLib **ppFaceLib);

/// 获取是否支持人脸比对库管理
/// \retval 1 支持
/// \retval 0 不支持
int PAL_API getFaceLibSupport(void);

/// @} end of group
#ifdef __cplusplus
}
#endif

#endif //__FACELIB_API_H__


